package com.solution.admin.auth.service.impl;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.solution.admin.auth.dao.ResourceDao;
import com.solution.admin.auth.dao.RoleDao;
import com.solution.admin.auth.entity.ResourceEntity;
import com.solution.admin.auth.entity.RoleEntity;
import com.solution.admin.auth.service.ResourceService;
import com.solution.common.dao.BaseDao;
import com.solution.common.service.impl.BaseServiceImpl;
import com.solution.common.utils.string.StringUtil;

/**
 * 资源业务管理层
 * 
 * @author zhuoyu
 * @date 2017年4月7日 上午10:44:54
 */
@Service
public class ResourceServiceImpl extends BaseServiceImpl<ResourceEntity> implements ResourceService {

	@Autowired
	private ResourceDao resourceDao;

	@Autowired
	private RoleDao roleDao;

	/**
	 * 查询资源列表
	 * @return
	 * @author zhuoyu
	 * @date 2017年4月18日 下午7:49:25
	 */
	@Override
	public List<ResourceEntity> resourceList() {
		// 获取顶级资源
		HashMap<String, Object> paramMap = new HashMap<String, Object>();
		paramMap.put("isDelete", 1);
		paramMap.put("status", 1);
		List<ResourceEntity> list = resourceDao.listBy(paramMap);
		/**
		for (int i = 0; i < list.size(); i++) {
			ResourceEntity res = list.get(i);
			if (res != null) {
				if (res.getResourceType().equals("1")) {
					if (this.ifChilds(res)) {
						List<ResourceEntity> subList = this.getChildList(res);
						if (subList != null) {
							res.setResourceChildList(subList);
							list.set(i, res);
						}
						subList = null;
					}
				}
			}
		}
		*/
		return list;
	}

	/**
	 * 添加资源
	 * 
	 * @param resourceEntity
	 * @return 返回主键
	 * @author zhuoyu
	 * @date 2017年4月18日 下午7:49:49
	 */
	@Override
	public long insertResource(ResourceEntity resourceEntity) {
		return resourceDao.insert(resourceEntity);
	}

	/**
	 * 修改资源
	 * 
	 * @param resourceEntity
	 * @return
	 * @author zhuoyu
	 * @date 2017年4月18日 下午7:50:01
	 */
	@Override
	public int updateResource(ResourceEntity resourceEntity) {
		return resourceDao.update(resourceEntity);
	}

	/**
	 * 删除资源
	 * 
	 * @param id
	 * @return
	 * @author zhuoyu
	 * @date 2017年4月18日 下午7:50:13
	 */
	@Override
	public int deleteResource(Long id) {
		return resourceDao.deleteById(id);
	}

	@Override
	protected BaseDao<ResourceEntity> getDao() {
		return resourceDao;
	}
	
	
	/**
	 * 根据id查询详细
	 * @param id 资源编号
	 * @return
	 * @author zhuoyu
	 * @date 2017年4月18日 下午7:50:43
	 */
	@Override
	public ResourceEntity getResourceById(Long id) {
		return resourceDao.getById(id);
	}

	/**
	 * 查询用户登录某系统的权限列表
	 * 
	 * @param param
	 *            userId 用户id systemId 登录系统的id
	 * @return
	 * @author llp
	 * @date 2017年4月18日 上午11:54:38
	 */
	@Override
	public List<ResourceEntity> listResource(Map<String, Object> param) {
		return resourceDao.listResource(param);
	}

	/**
	 * 查询用户菜单
	 * 
	 * @param param
	 *            userId 用户id systemId 登录系统的id
	 * @return
	 * @author llp
	 * @date 2017年4月18日 上午11:54:38
	 */
	@Override
	public List<ResourceEntity> listResourceMenu(Map<String, Object> param) {
		return resourceDao.listResourceMenu(param);
	}

	/**
	 * 根据经销商id查询资源
	 * 
	 * @param dealerId
	 *            经销商ID
	 * @return
	 * @author zhuoyu
	 * @date 2017年4月18日 下午7:55:52
	 */
	@Override
	public List<ResourceEntity> getResourceForTree() {
		return resourceDao.getResourceForTree();
	}

	/**
	 * 通过复杂的参数统计资源信息的数量
	 * 
	 * @param paramMap
	 *            参数集合
	 * @return 符合条件的记录数
	 */
	@Override
	public int listByExCount(Map<String, Object> paramMap) {
		return resourceDao.listByExCount(paramMap);
	}

	/**
	 * 取得某经销商角色的资源列表
	 * 
	 * @param dealerId
	 *            经销商ID
	 * @param roleId
	 *            角色ID
	 * @return 符合条件的对象集合
	 */
	@Override
	public List<ResourceEntity> getRoleResourceList( Long roleId) {
		return resourceDao.getRoleResourceList(roleId);
	}

	/**
	 * 对经销商角色进行资源授权
	 * 
	 * @param dealerId
	 *            经销商ID
	 * @param roleId
	 *            角色ID
	 * @param resourceIds
	 *            分配的资源ID集合
	 * @return 已分配资源数量
	 */
	@Override
	public int insertRoleResource( Long roleId, List<String> resourceIds) {
		return resourceDao.insertRoleResource( roleId, resourceIds);
	}

	/**
	 * 清除某经销商角色的已分配资源
	 * 
	 * @param roleId
	 *            角色ID
	 * @param dealerId
	 *            经销商ID
	 * @return 清除的资源数量
	 */
	@Override
	public int clearRoleResource(Long roleId) {
		return resourceDao.clearRoleResource(roleId);
	}
	
	/**
	 * 取得指定用户的可用菜单项
	 * 
	 * @param userId
	 *            用户编号
	 * @return 取得的菜单资源列表（树形有下级）
	 */
	@Override
	public List<ResourceEntity> getUserMenuList( Long userId){
		return this.resourceDao.getUserMenuList( userId);
	}
	
	
	/**
	 * 修改用户角色
	 * @param role
	 * @param resourceIds
	 * @return
	 */
	@Override
	@Transactional(rollbackFor=Exception.class)
	public int modifyRoleResources(RoleEntity role,List<String> resIdsList){
		//修改角色
		int count =  roleDao.update(role);
		//修改角色资源关系，选删除后插入
		count = roleDao.deleteRoleResourceById(role.getId());
		List<String> resourceList = new ArrayList<String>();
		if(resIdsList !=null && resIdsList.size()>0 ){
			for (String rid : resIdsList) {
				if(StringUtil.isNotEmpty(rid)){
					resourceList.add(rid);
				}
			}
			count = resourceDao.insertRoleResource(role.getId(), resourceList);
		}
		return count;
	}
	
}
